package com.cskaoyan.javase._1extends._5protected._2example.clone;

import com.cskaoyan.javase._1extends._5protected._2example.one.Test2;

/**
 * Object类当中的clone方法:
 *   protected native Object clone() throws CloneNotSupportedException;
 * clone方法拥有受保护的访问权限,它处在java.lang.Object类当中,而Object类是Java中所有类的父类
 *
 * @since 10:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 创建Student对象,调用clone方法,可不可以?
        /*
            分析:
                Student和Demo都是Object类的子类
                这里是Demo类当中
                访问Object这个父类中的受保护成员,只有一种可行:
                    创建子类自身对象,就是Demo类的对象才可以访问
                显然创建Student对象,肯定是不行的
         */
        Student s = new Student();
        // 'clone()' has protected access in 'java.lang.Object'
        // s.clone();

        Demo d = new Demo();
        // Unhandled exception: java.lang.CloneNotSupportedException
        // 这个报错是因为异常,不是因为访问权限,直接Alt + 回车解决即可!
        d.clone();

        // 这里能不能直接创建Teacher对象,调用clone方法呢?
        Teacher t = new Teacher();
        t.clone();

    }
}

// Class 'Student' explicitly extends 'java.lang.Object'
// 一个类如果没有用extends关键字直接继承某个类,那么它就隐式直接继承Object
// 而一个类如果直接用extends关键字继承了某个类,那么它的间接父类也有Object
class Student {
    public void test() throws CloneNotSupportedException {
        // 隐含this指向自身对象,都不用创建对象了,直接调用clone方法
        clone();
    }

    public static void testStatic() throws CloneNotSupportedException {
        Student s = new Student();
        s.clone();
    }
}

class Teacher {
    // 演示,方法的重写,修改从父类中继承过来的方法的访问权限
    /*
        这里虽然只是把父类方法的protected关键字抄下来
        但是包的位置改变了
        其实已经修改了访问权限,因为现在同包下可以直接访问了
        而原先的包是java.lang包
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}